#include "../include/Carte.h"

#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;

Carte::Carte (char nom_fichier[])

{

    def_xymax(nom_fichier);

    ini_tableaudy();

    ini_carte(nom_fichier);
}

Carte::~Carte()
{
    for (int i=0;i<ymax;i++)
    {
        delete[] ma_carte[i];
    }
    delete[] ma_carte;
}

void Carte::ini_tableaudy()
{
    ma_carte = new int* [ymax];

    for (int i=0;i<ymax;i++)
    {
        ma_carte[i] = new int [xmax];
    }

}

void Carte::init_a_zero ()
{

    for (int i=0;i<ymax;i++)
    {
        for (int j=0;j<xmax;j++)
        {
            ma_carte[i][j] = 0;
        }
    }

}

void Carte::def_xymax(char nom_fichier[])
{
    int i,j, f_nombre;
    i=0;
    j=0;

    // On remplit la carte de case vide

     char f_nom_fichier[50] = "data/";
     strcat (f_nom_fichier,nom_fichier);

     // f_nom_fichier contient maintenant le chemain d'accès au fichier

     ifstream fichier_carte (f_nom_fichier, ios::in);

     // On vient d'ouvrir le fichier en lecture


     if (fichier_carte)
     {
        while (i<2)
                     {

                        fichier_carte >> f_nombre;
                        if (i == 0)
                        {

                            xmax = f_nombre;
                        }
                        if (i == 1)
                        {
                            ymax = f_nombre;
                        }

                        i++;

                     }
        }
        //On a récupéré xmax et ymax
        else
       {
        cout<<"ERREUR: NOM DE FICHIER INCORRECT";
       }
       fichier_carte.close();

}

void Carte::ini_carte (char nom_fichier[])
{

        // On récupère xmax et ymax, pour pouvoir boucler un nombre définis de fois.

        def_xymax(nom_fichier);
        init_a_zero();
        int f_nombre;
        int i = 0;
        int j = 0;
        char f_nom_fichier[50] = "data/";
        strcat (f_nom_fichier,nom_fichier);

     // f_nom_fichier contient maintenant le chemain d'accès au fichier

        ifstream fichier_carte (f_nom_fichier, ios::in);

        fichier_carte >> f_nombre;//  On n'utilise pas les deux
        fichier_carte >> f_nombre;// premiers caractères

        while (fichier_carte >> f_nombre)
        {
            ma_carte[i][j] = f_nombre;
            j++;

            if (j == xmax)
            {
                j=0;
                i++;
            }
        }


     fichier_carte.close();


        // ma_carte contient maintenant la carte.
}


int Carte::recup_case (int dimy, int dimx)

{
    return ma_carte[dimy][dimx];
}


bool Carte::case_franchissable (int p_dimx, int p_dimy)
{
    bool f_franchissable = true;

    if (p_dimy < 0 || p_dimx < 0 || p_dimy > recup_ymax() || p_dimx > recup_xmax()) // On vérifie que le joueur ne quitte pas la carte
    {
        f_franchissable = false;
    }
    else if (ma_carte[p_dimy][p_dimx]>20 || ma_carte[p_dimy][p_dimx] == 0) // On vérifie que la case n'est pas infranchissable
    {
        f_franchissable = false;
    }

    return f_franchissable;
}




int Carte::recup_xmax()
{
    return xmax;
}

int Carte::recup_ymax()
{
    return ymax;
}

void Carte::test_reg()
{

    cout << "Test" << endl;
    cout << recup_case(9,4) << endl;
    cout << recup_case(0,14) << endl;
    cout << recup_case(0,15) << endl;
    cout << "Test" << endl;
    cout << case_franchissable(15,0) << endl;
    cout << recup_xmax() << endl;
    cout << recup_ymax() << endl;

}

bool Carte::si_combat(bool reinitialise)
{
    bool f_resultat = false;

    if (proba_combat < 0 && !chef_equipe->est_en_mouvement())
    {
        f_resultat = true;
        if (reinitialise)
        {
            proba_combat = rand()%10 + 10;
        }

    }

    return f_resultat;
}


void Carte::positionne_heros(Heros* p_heros, int p_x, int p_y)
{
    chef_equipe = p_heros;
    chef_equipe->modif_pos_x(p_x);
    chef_equipe->modif_pos_y(p_y);

    proba_combat = rand()%10 + 50;
}

bool Carte::deplacer_heros(int p_vect_x, int p_vect_y)
{
    bool f_resultat = false;

    bool f_franchissable = case_franchissable(chef_equipe->recup_pos_x()+p_vect_x, chef_equipe->recup_pos_y()+p_vect_y);

    if(f_franchissable && !chef_equipe->est_en_mouvement())
    {
        proba_combat--;
        chef_equipe->se_deplace(p_vect_x, p_vect_y);
        f_resultat = true;
    }

    return f_resultat;
}

int Carte::recup_case_heros()
{
    return recup_case(chef_equipe->recup_pos_y(), chef_equipe->recup_pos_x());
}
